home *** CD-ROM | disk | FTP | other *** search
/ Turnbull China Bikeride / Turnbull China Bikeride - Disc 1.iso / HENSA / MISC / SHELL.ARC / Shell / !Help < prev    next >
Text File  |  1994-12-06  |  14KB  |  374 lines

  1.  
  2.               Shell C library 1.13 06 Dec 1994
  3.               --------------------------------
  4.  
  5.  
  6. ________________________________________________________________________
  7.  
  8.  
  9.  
  10.  
  11.  
  12. About Shell
  13. -----------
  14.  
  15.  
  16. Shell is a set of C routines which allow you to easily make
  17. multi-tasking RISC OS programs which can display complicated items like
  18. arrays, bar-graphs, blocks of text etc in windows. It uses the routines
  19. in the DeskLib C lbrary. I wrote the Shell library to enable easy
  20. development of neural-network simulation programs for my PhD, so it is
  21. probably of most use to people wanting to display large amounts of data
  22. in windows. It also provides lots of example code for writing wimp
  23. applications.
  24.  
  25. Most of the routines are not optimised for speed, but for ease of use -
  26. for instance, there are routines which print text in a window using
  27. workarea coordinates, so that window-redrawing routines can work
  28. exclusively in workarea coordinates. There are similar routines (some
  29. macros) for drawing lines/circles/rectangles etc.
  30.  
  31. The header files are fairly well commented, and the example program
  32. ShellEG should provide a clear idear of what Shell routines can do, and
  33. how to use them.
  34.  
  35.  
  36. ________________________________________________________________________
  37.  
  38.  
  39.  
  40.  
  41.  
  42.  
  43. How Shell works:
  44. ----------------
  45.  
  46. When you use Shell, you open one or more Shell-windows. The redrawing of
  47. these windows is done entirely by the Shell library using DeskLib's
  48. Event_ library - you don't have to worry about redraw rectangles etc. 
  49.  
  50. Each Shell window can have any number of rectangle inside it. Each
  51. rectangle has a C structure assciated with it, which contains all the
  52. information needed to redraw the rectangle, i.e. a pointer to a
  53. redrawing function, and various other data like the rectangle's
  54. dimensions. Some simple rectangle redrawing functions are already part
  55. of Shell, to draw a 2D array of text, a bar graph, or a block of text.
  56.  
  57. When a redrawing function is called, it can work in coords relative to
  58. the rectangle, not the window workarea coords or the screen's coords; to
  59. do this, use the supplied strucure Shell_convertpoint 'convert', which
  60. actually represents the screen coords of the bottom-left of the
  61. rectangle. To plot things, use Shell_Plot( plotcode, x, y, convert), or
  62. Shell_Circle( x, y, r, convert) etc. These are macros which will use
  63. 'convert' to find the screen coors. See some of the supplied redraw
  64. functions for examples of using these, e.g. sources.c.BarGraph,
  65. sources.c.TextRect or sources.c.Label.
  66.  
  67. You can add a rectangle to a window with Shell_AddRectangle, supplying a
  68. function which Shell will call when this rectangle needs redrawing. If,
  69. instead, you just want a standard rectangle type, call Shell_Add2DArray,
  70. Shell_AddBarGraph, Shell_AddTextRect or Shell_AddGeneralArray etc. Many
  71. of these higher-level rectangles still require a simple function from
  72. you; e.g. Shell_AddGeneralArray needs a function which, given an x and
  73. y, returns a string to display at location (x,y) in the rectangle.
  74.  
  75. The TextRect functions allow you to print to a rectangle using the same
  76. syntax as 'printf'. Thus you can have large amounts of text in a block
  77. inside a window providing the functionality of running a program in a
  78. taskwindow, but also allowing the use of the more graphical displays
  79. such as arrays and bar-graphs.
  80.  
  81. You can also force rectangles/arrays etc. to be redrawn, for instance if
  82. their contents have changed.
  83.  
  84. You can still open windows independantly of Shell if you wish - Shell
  85. uses DeskLib's Event_Poll function, so any such window should be redrawn
  86. etc using Event_ handlers. Also, if you register a handler for
  87. event_REDRAW, you can do your own redrawing inside Shell windows.
  88.  
  89. You can use Shell_ to help debug a Wimp application, as long as the
  90. application uses DeskLib's Event_ library. For example, you can output
  91. diagnostic information to a window using Shell_Printf( ...) from within
  92. your code. You shouldn't do this in the middle of redrawing code, for
  93. example, as this will confuse the Wimp. There is now a function
  94. Shell_WaitPrintf( ...) which you can use for this purpose. It is very
  95. useful if you want to find out why your redrawing is not working.
  96.  
  97.  
  98. I wrote Shell for use with programs which are basically mathematical
  99. models, that take hours to run, which I wanted to run in the background.
  100. i.e. they aren't conventional event-driven Wimp application. Because of
  101. this, I've written a very simple front-end to Event_Poll called
  102. Shell_Poll which repeatedly calls Event_Poll until an event_NULL is
  103. received. To make a program multi-tasking, just sprinkle a few
  104. Shell_Poll's through a program. Thus by calling Shell_Poll frequently in
  105. your program, the system multitasks nicely, but your program gets time
  106. when there are event_NULL's available. There is also a macro
  107. Shell_PollSlow which calls Shell_Poll only if sufficient time has
  108. elapsed since the last call to Shell_Poll. This time interval is set
  109. with Shell_SetPollInterval. Using small values will result in a smooth
  110. desktop, while larger values will result in fewer calls to Wimp_Poll
  111. giving a jerky desktop but a faster program. 
  112.  
  113. You don't have to use Shell_Poll - if your application is a conventional
  114. event-driven one, you should just call Event_Poll directly.
  115.  
  116.  
  117. You can also set the frequency with which rects are updated so that you
  118. can tell Shell that a rect's contents have changed very frequently, but
  119. Shell won't call Wimp_ForceRedraw each time. This speeds up your program
  120. significantly as it means it's not continually readrawing a window.
  121.  
  122. Many rectangles can be saved in the desktop by Shift-Menu clicking on
  123. them. e.g. you can save the times-table in the example program as text.
  124.  
  125. One very useful feature is a PlainRect. This is displayed as just a
  126. blank rectangle inside a window, but when you save it, it saves its
  127. contents as a sprite, allowing you to extract bar graphs/blockrects etc
  128. directly without grabbing bits of the screen with !Paint.
  129.  
  130.  
  131.  
  132. ________________________________________________________________________
  133.  
  134.  
  135. Problems
  136. --------
  137.  
  138.  
  139. Shell has quite a few rough edges - for e.g. the maximum nuber of
  140. windows is #defined as 4, which is ample for my programs but might not
  141. be enough for everyone. The windows are stored in an array, but they
  142. should really be a linked list (like the rectangles in each window,
  143. which use DeskLib's LinkList functions).
  144.  
  145. Other things which aren't perfect are:
  146.  
  147. FontLabel.c    the font handle is not updated when a mode-change
  148.         occurs, and the colours don't work very well in
  149.         256-colour modes.
  150.  
  151. BarGraph.c    No facility for negative-height bars.
  152.  
  153. TextRect.c    The text is not formated - you need to put '\n' in 
  154.         occasionaly if you want the text to be multiline. This
  155.         is not too bad as printf behaves in the same way.
  156.  
  157. PlainRect.c    This saves an area of a Shell window as a sprite by 
  158.         redirecting to a sprite, and forcing a redraw of the
  159.         area. Text is half-size (in square pixel modes) and the
  160.         outlines of Shell rectangles (which are created with 
  161.         Wimp_PlotIcon) don't show up for some reason.
  162.  
  163. SpriteRect.c    Doesn't detect mode changes, and so spriterects don't
  164.         work properly if you change mode.
  165.  
  166. No facilities are provided for deleting rectangles and free-ing the
  167. memory they took up.
  168.  
  169. And some more which I've forgotton about.
  170.  
  171.  
  172. NB If anyone can fix the problems with sprites and fonts when the screen
  173. mode is changed, it would be very useful. I don't tend to change mode
  174. very often so haven't really the inclination to fix these problems
  175. myself...
  176.  
  177.  
  178.  
  179. One thing which might make the source files difficult to read for users
  180. of !Edit is the profusion of Tabs. The solution is to use the excellent
  181. freeware !Zap text editor - you won't want to use !Edit again after
  182. seeing !Zap. For users of other text editors, the tabs in Zap tab to 8
  183. spaces so any other value will result in strange non-aligned text. I
  184. also have my display width set to 98 characters for C code, which is
  185. slightly too big for a mode 31 screen, but allows one extra tab for each
  186. line.
  187.  
  188. Any application which uses Shell has to have a window called
  189. 'ShellWindow' in its template file - Shell_OpenWindow assumes this name.
  190.  
  191.  
  192. One of the main uses of Shell is to show how to cope with redrawing
  193. windows in the Wimp enviroment - I found this quite difficult to start
  194. with. Hopefully, the Shell sources will help people understand how the
  195. Wimp redrawing system works.
  196.  
  197.  
  198. _________________________________________________________________________
  199.  
  200.  
  201. Installation.
  202. -------------
  203.  
  204. You should simply move the whole Shell library directory into your C
  205. path. Don't move any headers into an existing .h. directory. Shell has
  206. many header files, some of which might be the same name as ones you
  207. already have; thus Shell source files have lines like: 
  208.  
  209. #include "Shell.Array.h"
  210.  
  211. which should also be used by any of your code which uses Shell.
  212.  
  213. e.g.., if <C$Path> = ADFS:4.$.CLibs., ...other.libraries... 
  214.  
  215. then you should put the entire Shell directory in ADFS:4.$.CLibs to get
  216. a tree that looks like:
  217.  
  218. ADFS:4.$.CLibs.
  219.                h.
  220.                  header1      /* your existing headers */
  221.                  header2
  222.                  ...
  223.                
  224.                o.
  225.                  RISC_OSLib   /* your existing libraries */
  226.                  ...
  227.                
  228.                Shell.
  229.                      h.
  230.                        Shell
  231.                        Array
  232.                        ...
  233.                     
  234.                      o.ShellLib
  235.                     
  236.                      Sources.
  237.                              c.
  238.                                Array
  239.                                Label
  240.                                ...
  241.                              
  242.                              MakeFile
  243.                              
  244.                              o.
  245.                                Array
  246.                                Label
  247.                                ...
  248.  
  249.  
  250. You should link with C:Shell.o.ShellLib, or C:Shell.o.ShellEC if you use
  251. EasyC (EasyC's library format is different from Acorn's, so
  252. Shell.o.ShellEC contains exactly the same object files as
  253. Shell.o.ShellLib, except that they have been made into the one library
  254. file using EasyC's library-making tool rather than Acorn's LibFile).
  255.  
  256.  
  257. An alternative to this is to run the obey file !Boot in the Shell
  258. directory before you start to use Shell, which sets <ShellLib$Path> and
  259. change all #include lines to #include "ShellLib:Array.h", while linking
  260. with 'ShellLib:o.ShellLib'. This approach is similar to that used by
  261. DeskLib. Bear in mind that I don't do this so it hasn't really been
  262. checked.
  263.  
  264. If you use FilerPatch (by Jens Ovesen), the Shell directory will
  265. actually behave like an application 'cos one of its access bits is set,
  266. and be displayed with a Shell sprite, and the !Boot file will be run
  267. automatically.
  268.  
  269.  
  270.  
  271. ___________________________________________________________________________
  272.  
  273.  
  274. Things to do
  275. ------------
  276.  
  277.  
  278. What would be really nice would be to have a command-line input, so that
  279. commands could be typed in and read by a function like Shell_scanf, with
  280. other functions such as Shell_getc etc. You could have input from
  281. different input rectangles, so Shell_scanf( Shell_rectblock *rectblock,
  282. "%i", &x). There could also be a general input rectangle attatched to
  283. the general output textrect, which would be read by Shell_scanf( NULL,
  284. ...). This would make Shell_ completely implement a standard textual
  285. input/output system like taskwindows, but with easy to use graphics
  286. facilities as well.
  287.  
  288. Simple x-y graphs. I've got code to do this but it's a bit messy at the
  289. mo.
  290.  
  291. Add a saver for blockrects to save as a sprite - Done that now.
  292.  
  293. Add a saver for bargraphs.
  294.  
  295. Have a rect which displays a sprite from a spritefile - I have a messy
  296. version of this which isn't in a fit state to be included.
  297.  
  298. At the moment, rectangles have colours and can have an icon-style
  299. border. The default routines add various borders automatically, using
  300. Shell_MakeRectIcon. An alternative way of doing this would be to put a
  301. set of icons in the 'ShellWindow' in the Templates file, called 'Array',
  302. 'RectBlock' ... etc, so that any RectBlocks would have icon
  303. charateristics (such as colours, border) from the templates file.
  304.  
  305. Add facilities to delete rectangles, freeing allocated space etc. I've
  306. never actually needed to do this, but these functions should really be
  307. included in the library.
  308.  
  309.  
  310. ___________________________________________________________________________
  311.  
  312.  
  313. The Save102 sub-library
  314. -----------------------
  315.  
  316. This library is the latest version 1.02 of the Save sublibrary from
  317. DeskLib (with all function names prefixed by 'Shell_') . The reason it
  318. is included here is that Shell was changed ages ago to use Save 1.02,
  319. but the current version of DeskLib (2.10) uses Save 1.00, which doesn't
  320. work with Shell.
  321.  
  322. When a newer version of DeskLib is released, I'll release a new Shell
  323. without the Save102 library, which will use the DeskLib Save functions.
  324.  
  325.  
  326. ___________________________________________________________________________
  327.  
  328.  
  329. Other things
  330. ------------
  331.  
  332. Shell is freeware and © Julian Smith. Feel free to distribute it, but
  333. please distribute the original, not altered copies. You are not allowed
  334. to charge more than the disc (or other medium) price for distributing
  335. Shell.
  336.  
  337. Thanks to Alan Fitch for the shell sprites and !Run and !Obey files in
  338. the Shell directory. These enable things like #include
  339. "ShellLib:SpriteRect.h" as in DeskLib, if you double click one of them. 
  340.  
  341. Thanks also to Ian MacDougall for making the EasyC version of the
  342. library.
  343.  
  344.  
  345. If you write any routines for extra rectangle types (e.g. to draw a
  346. sprite in a window, or a drawfile in a window), please send them to me
  347. so they can be included in the next release.
  348.  
  349. If you have any queries/suggestions/good ideas/extra routines/complaints
  350. relating to Shell, I'd like to hear from you.  Feel free to contact me
  351. at the address below:
  352.  
  353.  
  354. Julian Smith
  355.  
  356.  
  357. ------------------------
  358. julians@cogsci.ed.ac.uk
  359. ------------------------
  360.  
  361. or:
  362.  
  363. ------------------------
  364. Department of Psychology
  365. University of Edinburgh
  366. 7 George Square
  367. Edinburgh 
  368. EH8 9JZ
  369. UK
  370. ------------------------
  371.  
  372.  
  373.  
  374.